import * as React from 'react';

export const { isValidElement } = React;

export function isFragment(child: React.ReactElement): boolean {
	return child && isValidElement(child) && child.type === React.Fragment;
}

type AnyObject = Record<PropertyKey, any>;

type RenderProps = AnyObject | ((originProps: AnyObject) => AnyObject | void);

export function replaceElement(
	element: React.ReactNode,
	replacement: React.ReactNode,
	props?: RenderProps
): React.ReactNode {
	if (!isValidElement(element)) {
		return replacement;
	}
	return React.cloneElement(
		element,
		typeof props === 'function' ? props(element.props || {}) : props
	);
}

export function cloneElement(
	element: React.ReactNode,
	props?: RenderProps
): React.ReactElement {
	return replaceElement(element, element, props) as React.ReactElement;
}
